From: Keir Fraser Date: Mon, 7 Sep 2009 12:49:35 +0000 (+0100) Subject: vt-d: avoid obtaining iommu->register_lock too early in X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13368 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=4fe3160cbc7c4e71a85db069186ca26407acba77;p=xen.git vt-d: avoid obtaining iommu->register_lock too early in dma_msi_set_affinity() If set_desc_affinity() fails, the current code doesn't release the spinlock. We should obtain the lock at a later place. Signed-off-by: Dexuan Cui --- diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index b5131d86df..30370df584 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -826,7 +826,6 @@ static void dma_msi_set_affinity(unsigned int irq, cpumask_t mask) struct irq_desc *desc = irq_to_desc(irq); struct irq_cfg *cfg = desc->chip_data; - spin_lock_irqsave(&iommu->register_lock, flags); #ifdef CONFIG_X86 dest = set_desc_affinity(desc, mask); if (dest == BAD_APICID){ @@ -862,6 +861,7 @@ static void dma_msi_set_affinity(unsigned int irq, cpumask_t mask) msg.address_lo |= dest << MSI_TARGET_CPU_SHIFT; #endif + spin_lock_irqsave(&iommu->register_lock, flags); dmar_writel(iommu->reg, DMAR_FEDATA_REG, msg.data); dmar_writel(iommu->reg, DMAR_FEADDR_REG, msg.address_lo); dmar_writel(iommu->reg, DMAR_FEUADDR_REG, msg.address_hi);